<?php

declare(strict_types=1);

namespace App\Controller\Api\v1;

use App\Controller\AbstractController;
use App\Master\Framework\Library\Tencent\FaceCheck;
use App\Request\Api\v1\DemoIndexRequest;
use App\Service\QueueService;
use App\Utils\AppResult;
use App\Utils\Common;
use App\Utils\Control\AuthUser;
use App\Utils\Encrypt\Token;
use App\Utils\RedisUtil;
use Hyperf\Di\Annotation\Inject;
use Psr\Http\Message\ServerRequestInterface;

/**
 * Demo
 * 示例
 */
class DemoController extends AbstractController
{
    // 日志模块名称
    const LOG_MODULE = 'v1/DemoController';

    #[Inject]
    protected QueueService $service;

    /**
     * 示例接口
     *
     * @param DemoIndexRequest $request 校验参数注入类
     * @return \Psr\Http\Message\ResponseInterface
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     */
    public function index(DemoIndexRequest $request)
    {
        /**
         * 当处理HTTP请求时，无论是通过路径参数、查询参数还是请求体传递的参数，Hyperf都会将其作为字符串类型返回。
         * 这是因为HTTP请求中的参数本质上就是字符串，即使它们代表的是其他数据类型（如整数、布尔值等）。
         * 注意：所有的参数（除 Content-type:application/json 外）类型都是字符串 如有需要 则可强转后使用
         * 例如，如果期望得到一个整数值，可以使用 intval() 函数将字符串转换为整数。同样，对于布尔值，可以使用 boolval() 函数。
         *
         * POST 建议使用 Content-type:application/json
         */
        $params = $request->validated();// 获取校验参数结果
        // 腾讯云人脸核身结果查询
//        $face = new FaceCheck();
//        $face->getFaceRecord($params['token'],1);
//        return AppResult::response200(result: $face->getData());

        /**
         * 获取用户信息
         */
        $user = AuthUser::getInstance()->get();

        RedisUtil::getInstance('test')->setex(1,20000);

//        $model = new DemoModel();
//        $list  = $model->getList($params);
//
//        $setup = Module::_SetupModule('siteBase');
//
//        // 测试投递异步队列消息
//        $this->service->demoPush(['name' => 'one'], 10);
//        $this->service->demoTwoPush(['name' => 'two']);
//
//        // 携程 闭包
//        co(function () use ($params){
//            sleep(10);
//        });

        $token = Token::create(['user_id' => 1,'uid' => 22]);
        $check_token = Token::check($params['token']);

        return AppResult::response200('Coming Soon!!!', [
            'params' => $params,
            'token' => $token,
            'check_token' => $check_token,
        ]);
    }

    /**
     * 原始示例
     *
     * @param ServerRequestInterface $request
     * @return \Psr\Http\Message\ResponseInterface
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     */
    public function demo01(ServerRequestInterface $request)
    {
        return AppResult::response200('Coming Soon!!!', [
            // 获取请求参数方式
            'params' => $request->getQueryParams()
        ]);
    }

    /**
     * 抽奖示例接口
     *
     * @return \Psr\Http\Message\ResponseInterface
     * @throws \Psr\Container\ContainerExceptionInterface
     * @throws \Psr\Container\NotFoundExceptionInterface
     */
    public function draw()
    {
        // 参与者列表，包含姓名和对应的概率权重（相加等于 100） // 确保概率相加等于 100
        $participants = [
            ['name' => 'D', 'weight' => 338.30],
            ['name' => 'A', 'weight' => 0.35], // 注意概率值需要保留两位小数
            ['name' => 'B', 'weight' => 0.79],
            ['name' => 'C', 'weight' => 8.03],
            ['name' => 'E', 'weight' => 652.53]
        ];
        $winTop = [
            'A' => 0,
            'B' => 0,
            'C' => 0,
            'D' => 0,
            'E' => 0,
            'F' => 0
        ];
        $top = [];
        for ($i = 0; $i < 10000; $i++) {
            $win = Common::lotteryDraw($participants, 'name');
            $win != false && $winTop[$win] += 1;
            $win == false && $winTop['F'] += 1;
            $win == 'A' && $top[] = $i + 1;
        }

        return AppResult::response200('Coming Soon!!!', [
            'participants' => $participants,
            'winTop' => $winTop,
            'top' => $top,
        ]);
    }
}